'''
Created on Feb 17, 2011

@author: kivson
'''
from optparse import OptionParser
import sys
from vo.arquivo import Arquivo
import negocio.arquivos, negocio.ftpCripto, negocio.nomes, negocio.utilidades
import getpass
from negocio import utilidades, hashs
from dao.genericDAO import GDAO
import os.path

def main():
    
    opcoes, argumentos =  ConfigParser()
    
    if len(argumentos) < 2:
        return
    try:
        ftp = negocio.ftpCripto.FTPCripto(argumentos[1]) 
    except:
        print "Erro ao acessar Ftp."
        return
    #print opcoes.usuario
    if opcoes.usuario is None:
        usuario = raw_input("User: ")
        print usuario
    else:
        usuario = opcoes.usuario
    senha = getpass.getpass("Senha: ")
    
    try:
        ftp.login(usuario, senha)
    except:
        print "Erro ao logar no Ftp."
        return
    #print argumentos
    busca = negocio.arquivos.BuscaArquivo(argumentos[0])
    listaDeArquivos = busca.pegaTodos()
    
    gerador = negocio.nomes.NomeGen()
    #print listaDeArquivos
    
    #banco, base = carregaBanco("banco.db")
    #atexit.register(banco.close)
    dao = GDAO()
    for NomeCompletoArquivo in listaDeArquivos:
        
        print "Trabalahndo com: %s" % NomeCompletoArquivo
        pastaArquivo, nomeArquivo = os.path.split(NomeCompletoArquivo)
        
        nomeArquivo = nomeArquivo.strip(' \n')
        ''' Caso o Arquivo ja exista, CONTINUA'''
        if opcoes.md5:
            print "Calculando o Hash do arquivo...",
            hasher = hashs.Md5(NomeCompletoArquivo)
            hashDoArquivo = hasher.calcula()
            print hashDoArquivo
            arquivoExite = dao.existeArquivoMd5(hashDoArquivo)
        else:
            arquivoExite = dao.existeArquivoNome(nomeArquivo)
        
        if arquivoExite:
            print "O arquivo jah esta no bando: %s" % arquivoExite 
            continue
        
        
        ''' 
        Abre o NomeCompletoArquivo para ser transferido
        '''
        with file(NomeCompletoArquivo, "rb") as arq:
            
            if not opcoes.md5:
                print "Calculando o Hash do Arquivo...",
                hasher = hashs.Md5(NomeCompletoArquivo)
                hashDoArquivo = hasher.calcula()
                print hashDoArquivo
            
            if opcoes.verbose:
                status = utilidades.Status(arq)
            else:
                status = None
            
            print "Envindo: " 
            ftp.storbinaryCripto('STOR '+ hashDoArquivo, arq, callback=status, blocksize = opcoes.bloco)
            
            novoArquivo = Arquivo(nomeArquivo, hashDoArquivo, pastaArquivo)
            dao.salva(novoArquivo)

            print "finish"
    
    print "Tudo Concluido!"
    #banco.close()

def ConfigParser():
    parser = OptionParser()
    parser.add_option("-u", "--user", dest="usuario",
                  help="usuario para o FTP.", metavar="FILE")
    parser.add_option("-v", "--verbose", action="store_true",
                  dest="verbose", default=False,
                  help="Mostra mais informacoes")
    parser.add_option("--md5", action="store_true",
                  dest="md5", default=False,
                  help="Verifica pelo Md5, inves de apenas pelo nome")
    parser.add_option("-b", "--block", dest="bloco", default = 8192, type=int,
                  help="usuario para o FTP.", metavar="FILE")
    
    return parser.parse_args(sys.argv[1:])


    
if __name__ == '__main__':
    main()